import { response } from "@/utils/response.js";
import { web_tags } from "@/data_base/models/web_tags.js";

/**
 * 添加新标签到 web_tags 表
 * @param {string} name - 要添加的标签名称
 * @returns {Promise<object>} - 包含添加结果的对象
 */
const add_web_tag = async name => {
	try {
		// 使用 web_tags 模型的 create 方法添加新记录
		const new_tag = await web_tags.create({ name });
		return response(200, new_tag.toJSON(), "添加web标签成功！");
	} catch (error) {
		return response(500, null, "添加web标签失败！");
	}
};

/**
 * 查询 web_tags 表中的全部标签记录
 * @returns {Promise<object>} - 包含查询结果的对象
 */
const get_all_web_tags = async () => {
	try {
		// 使用 web_tags 模型的 findAll 方法查询所有记录
		const all_tags = await web_tags.findAll();
		return response(
			200,
			all_tags.map(tag => tag.toJSON()),
			"查询全部web标签成功！"
		);
	} catch (error) {
		return response(500, null, "查询全部web标签失败！");
	}
};

/**
 * 根据 name 模糊查询 web_tags 表中的标签记录并分页
 * @param {string} name - 用于模糊查询的标签名称，传空字符串则查询全部
 * @param {number} page - 当前页码，从 1 开始
 * @param {number} pageSize - 每页显示的记录数
 * @returns {Promise<object>} - 包含查询结果和分页信息的对象
 */
const get_web_tags_by_name = async (name = "", page = 1, pageSize = 10) => {
	try {
		const offset = (page - 1) * pageSize;
		const whereCondition = name
			? { name: { [web_tags.sequelize.Op.like]: `%${name}%` } }
			: {};

		// 使用 web_tags 模型的 findAndCountAll 方法进行分页查询
		const { count, rows } = await web_tags.findAndCountAll({
			where: whereCondition,
			offset,
			limit: pageSize,
		});

		const totalPages = Math.ceil(count / pageSize);
		return response(
			200,
			{
				data: rows.map(tag => tag.toJSON()),
				currentPage: page,
				pageSize,
				totalPages,
				totalItems: count,
			},
			"根据名称查询web标签成功！"
		);
	} catch (error) {
		return response(500, null, "根据名称查询web标签失败！");
	}
};

/**
 * 根据 id 修改 web_tags 表中的标签记录
 * @param {number} id - 要修改的标签的 id
 * @param {string} name - 新的标签名称
 * @returns {Promise<object>} - 包含修改结果的对象
 */
const update_web_tag_by_id = async (id, name) => {
	try {
		// 使用 web_tags 模型的 update 方法修改记录
		const [updatedCount] = await web_tags.update(
			{ name },
			{
				where: { id },
			}
		);
		if (updatedCount === 0) {
			return response(404, null, "未找到对应的web标签，修改失败！");
		}
		return response(200, null, "修改web标签成功！");
	} catch (error) {
		return response(500, null, "修改web标签失败！");
	}
};

/**
 * 根据 id 删除 web_tags 表中的标签记录
 * @param {number} id - 要删除的标签的 id
 * @returns {Promise<object>} - 包含删除结果的对象
 */
const delete_web_tag_by_id = async id => {
	try {
		// 使用 web_tags 模型的 destroy 方法删除记录
		const deletedCount = await web_tags.destroy({
			where: { id },
		});
		if (deletedCount === 0) {
			return response(404, null, "未找到对应的web标签，删除失败！");
		}
		return response(200, null, "删除web标签成功！");
	} catch (error) {
		return response(500, null, "删除web标签失败！");
	}
};

// 导出添加标签、查询全部标签、根据名称查询标签、根据id修改标签和根据id删除标签的方法
export {
	add_web_tag,
	get_all_web_tags,
	get_web_tags_by_name,
	update_web_tag_by_id,
	delete_web_tag_by_id,
};
